var HTTP = require('http'), PATH = require('path'), fs = require('fs'), CRYPTO = require('crypto');

var connect = require('connect');
var Step = require('./../../libs/step');
var log = require('./../lib/utils').warn;

	// 当前支持的 文件类型，你可以不断扩充。
	var MIME_TYPES = {
		'.txt': 'text/plain',
		'.md': 'text/plain',
		'': 'text/plain',
		'.html': 'text/html',
		'.css': 'text/css',
		'.js': 'application/javascript',
		'.json': 'application/json',
		'.jpg': 'image/jpeg',
		'.png': 'image/png',
		'.gif': 'image/gif'
	};

	MIME_TYPES['.htm'] = MIME_TYPES['.html'];

	var httpEntity = {
		contentType : null,
		data : null,
		getHeaders : function(EXPIRY_TIME){
			// 返回 HTTP Meta 的 Etag。可以了解 md5 加密方法
			var hash = CRYPTO.createHash('md5');
			hash.update(this.data);
			var etag = hash.digest('hex');

			return {
				'Content-Type': this.contentType,
				'Content-Length' : this.data.length,
				'Cache-Control' : 'max-age=' + EXPIRY_TIME,
				'ETag' : etag
			};
		}
	};

	exports.init = function(request, response, CONFIG){
		if(PATH.extname(request.url) === ''){
			connect.directory('C:/project/bigfoot')(request, response, function(){});
			// 如果 url 只是 目录 的，则列出目录
			// console.log('如果 url 只是 目录 的，则列出目录');
			// server500(response, '如果 url 只是 目录 的，则列出目录@todo');
		}else{
			var pathname = require('url').parse(request.url).pathname;
			// 如果 url 是 目录 + 文件名 的，则返回那个文件
			var path = CONFIG.site_base + pathname;

			Step(function(){
				console.log('请求 url :' + request.url +', path : ' + pathname);
				fs.exists(path, this);
			}, function(path_exists, err){
				if(err){
					server500(response, '查找文件失败！');
					return;
				}
				if(path_exists){
					fs.readFile(path, this);
				}else{
					response.writeHead(404, {'Content-Type': 'text/plain;charset=utf-8'});
					response.end('找不到 ' + path + '\n');
				}
			}, function(err, data) {
				if(err){
					server500(response, '读取文件失败！');
					return;
				}
				var extName = '.' + path.split('.').pop();
				var extName = MIME_TYPES[extName] || 'text/plain';

				var _httpEntity = Object.create(httpEntity);
				_httpEntity.contentType = extName;
				_httpEntity.data = new Buffer(data);

				// 命中缓存，Not Modified返回 304
				if(request.headers.hasOwnProperty('if-none-match') && request.headers['if-none-match'] === _httpEntity.ETag){
					response.writeHead(304);
					response.end();
				}else{
					// 缓存过期时限
					var EXPIRY_TIME = (CONFIG.file_expiry_time * 60).toString();

					response.writeHead(200, _httpEntity.getHeaders(EXPIRY_TIME));
					response.end(_httpEntity.data);
				}
			});
		}
	}

	function server500(response, msg){
		console.log(msg);
		response.writeHead(404, {'Content-Type': 'text/plain'});
		response.end(msg + '\n');
	}

	// 处理目录的方法 @todo
	function getDirectoryResponse( path, callback ){

	// 	var full_path = CONFIG.site_base + path;	// 完整路径
	// 	var template;
	// 	var i;

	// 	if ( CONFIG.directory_listing ){
	// 		PATH.exists( full_path, function ( path_exists ){
	// 			if ( path_exists ){
	// 				FS.readdir( full_path, function ( error, files ){
	// 					if ( error ){
	// //						Internal error
	// 						callback( new ResponseObject( {'data': error.stack, 'status': 500} ) );
	// 					}
	// 					else {
	// 						// 列出结果
	// //						Custard template
	// 						template = new CUSTARD;
							
	// 						template.addTagSet( 'h', require('./templates/tags/html') );
	// 						template.addTagSet( 'c', {
	// 							'title': 'Index of ' + path,
	// 							'file_list': function ( h ){
	// 								var items = [];
	// 								var stats;
	// 								for ( i = 0; i < files.length; i += 1 ){
	// 									stats = FS.statSync( full_path + files[i] );
	// 									if ( stats.isDirectory() ){
	// 										files[i] += '/';
	// 									}
	// 									items.push( h.el( 'li', [
	// 										h.el( 'a', {'href': path + files[i]}, files[i] )
	// 									] ) );
	// 								}
	// 								return items;
	// 							}
	// 						} );
							
	// 						template.render( template_directory, function ( error, html ){
	// 							if ( error ){
	// //								Internal error
	// 								callback( new ResponseObject( {'data': error.stack, 'status': 500} ) );
	// 							}
	// 							else {
	// 								callback( new ResponseObject( {'data': new Buffer( html ), 'type': 'text/html'} ) );
	// 							}
	// 						} );
	// 					}
	// 				} );
	// 			}
	// 			else {
	// 				// 找不到 文件，就是 404
	// //				Not found
	// 				callback( new ResponseObject( {'status': 404} ) );
	// 			}
	// 		} );
	// 	} else {
	// 		// 禁止 目录浏览，返回 403
	// //		Forbidden
	// 		callback( new ResponseObject( {'status': 403} ) );
	// 	}
	}
